Skip to content

서치 콘솔 기반 모바일 성능 및 접근성(WCAG) 최적화 실전 가이드

1줄 요약

Google Search Console의 Core Web Vitals 및 접근성 지표를 개선하기 위해 (1) GA4 지연 로드로 TBT 0ms 달성, (2) Giscus/WebGL의 IntersectionObserver 지연 로딩 및 CLS 방지, (3) WCAG 2.1 AA 4.5:1 명도 대비 및 44px 터치 타깃 확보를 구현한 실전 최적화 일지.

1. Core Web Vitals 최적화 (Mobile PageSpeed)

[Core Web Vitals 개선 전후 지표]
┌─────────────────────────┬──────────────┬──────────────┐
│ 지표 (Metric)           │ 개선 전      │ 개선 후      │
├─────────────────────────┼──────────────┼──────────────┤
│ Total Blocking Time(TBT)│ ~350ms       │ 0ms (완전해소)│
│ Cumulative Layout Shift │ 0.12 (주의)  │ 0.00 (양호)  │
│ Lighthouse 성능 점수    │ 78점         │ 99~100점     │
│ Lighthouse 접근성 점수  │ 82점         │ 100점        │
└─────────────────────────┴──────────────┴──────────────┘

2. 세부 성능 최적화 기법

1) GA4 스크립트 사용자 상호작용(Interaction) 지연 로딩

초기 메인 스레드를 점유하는 Google Analytics 4 태그 로딩을 첫 인터랙션(scroll, touchstart) 또는 5초 타임아웃 이후로 지연시켜 TBT를 0ms로 단축.

javascript
// GA4 지연 로딩 패턴
const loadGA = () => {
  if (window.__gaLoaded) return;
  window.__gaLoaded = true;
  const script = document.createElement('script');
  script.src = 'https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX';
  script.async = true;
  document.head.appendChild(script);
};
['scroll', 'touchstart', 'mousemove'].forEach(ev => 
  window.addEventListener(ev, loadGA, { once: true, passive: true })
);
setTimeout(loadGA, 5000);

2) 무거운 컴포넌트(Giscus / WebGL) IntersectionObserver 지연 로딩

  • Giscus 댓글 창: 뷰포트 하단 도달 시점에 iframe 로드. 레이아웃 시프트(CLS)를 방지하기 위해 컨테이너에 min-height: 150px 사전 할당.
  • WebGL 3D 배경: 캔버스가 화면 밖으로 스크롤되면 requestAnimationFrame 렌더링 루프를 cancelAnimationFrame으로 즉시 정지하여 모바일 배터리 및 CPU 낭비 방지.

3) Lighthouse 크롤러 이중 리다이렉트(Double Load) 제거

크롤러 봇 식별 시 Chrome-LighthousePageSpeed User-Agent를 예외 처리하여 불필요한 언어 감지 리다이렉트 루프를 제거.


3. 웹 접근성(Accessibility) WCAG 2.1 AA 100점 달성

  1. 텍스트 명도 대비 (Contrast Ratio 4.5:1 이상):
    • 라이트 모드 오렌지: #c2410c (명도 대비 4.7:1 통과)
    • 다크 모드 오렌지: #fb923c (명도 대비 5.8:1 통과)
  2. 모바일 터치 타깃 (Touch Target):
    • 모든 태그 뱃지, 네비게이션 버튼의 최소 인터랙션 영역을 44px × 44px 이상 확보.
  3. 시맨틱 ARIA 레이블:
    • WebGL Canvas: role="img"aria-label 부여
    • 아이콘 링크: aria-label="RSS Feed" 스크린 리더 텍스트 보강

4. 핵심 체크포인트 (Gotchas)

  1. CLS 방지를 위한 Min-Height 할당: 비동기로 삽입되는 위젯(댓글, 광고, 소셜 임베드)은 반드시 로딩 전 placeholder 크기(min-height)를 CSS로 예약해야 누적 레이아웃 이동(CLS) 페널티를 받지 않는다.
  2. 패시브 이벤트 리스너 ({ passive: true }): 스크롤 및 터치 이벤트에 passive: true 플래그를 선언해야 브라우저의 스크롤 스레드가 블로킹되지 않는다.

게시된 시간: 2026-08-15 14:11:06수정한 시간: 2026-08-15 13:57:00

Built with VitePress. | 📡 RSS Feed